\begin{tikzpicture}

	\definecolor{appcolor}       {rgb}{1,1,0.7}
	\definecolor{nitpickercolor} {rgb}{0.9,0.5,0.4}

	\tikzstyle{treenode} = [component, path fading=flow fade, align=center,
	                        rounded corners=1]

	\tikzstyle{nitpickernode} = [treenode, minimum width=12ex, minimum height=6ex, bottom color=nitpickercolor]
	\tikzstyle{appnode}       = [treenode, bottom color=appcolor]

	%
	% Components
	%

	% nitpicker
	\node[nitpickernode] (nitpicker) {Nitpicker\\GUI server};

	% xray trigger
	\node[treenode, right=15ex of nitpicker] (xraytrigger) {X-ray\\trigger};

	\path (nitpicker) -- coordinate (mid) (xraytrigger);

	% rom filter
	\node[treenode, below=8ex of mid] (romfilter) {ROM\\filter};


	%
	% Session relationships
	%

	\tikzstyle{treesessionarrow} = [arrow, thick, densely dashed]

	% xray trigger -> nitpicker
	\path[treesessionarrow] (xraytrigger.240)
		.. controls +(-3ex,-3ex) and +(3ex,-3ex) .. node {\emph{Nitpicker}} (nitpicker.320);

	%
	% Information flows
	%

	\tikzstyle{datamodel} = [fill=white, dropshadow, align=center,
	                         chamfered rectangle, draw, draw opacity=0.5,
	                         chamfered rectangle corners=north east,
	                         inner sep=0]

	\tikzstyle{informationflow} = [opacity=0.4,
	                         decoration={markings,
	                         mark=between positions 0.07 and 1 step 1ex with {\arrow{latex}}},
	                         postaction={decorate}]

	%
	% Nitpicker config generated from ROM filter
	%
	\path[informationflow] (romfilter.180)
		.. controls +(-8ex,0ex) and +(0ex,-8ex) ..
		node[pos=0.7] (nitpickerconfigrom) {} (nitpicker.260);

	\path (nitpickerconfigrom) node[datamodel, xshift=0ex] {
		\tiny
		\begin{lstlisting}
Config
		\end{lstlisting}
	};


	%
	% X-ray mode generated by X-ray trigger
	%
	\path[informationflow] (xraytrigger.270)
		.. controls +(0ex,-8ex) and +(8ex,0ex) ..
		node[pos=0.4] (xrayrom) {} (romfilter.0);

	\path (xrayrom) node[datamodel, xshift=2ex] {
		\tiny
		\begin{lstlisting}
X-ray mode
enabled/disabled
		\end{lstlisting}
	};


	%
	% Hovered session provided by nitpicker to xray trigger
	%
	\path[informationflow] (nitpicker.20)
		.. controls +(5ex,3ex) and +(-5ex,3ex) ..
		node[pos=0.5] (hoverrom) {} (xraytrigger.160);

	\path (hoverrom) node[datamodel, xshift=2ex] {
		\tiny
		\begin{lstlisting}
Hover
		\end{lstlisting}
	};


	%
	% ROM filter configuration
	%
	\path[informationflow] (romfilter)+(0,-6ex) --
		node[pos=0] (romfilterconfigrom) {} (romfilter.270);

	\path (romfilterconfigrom) node[datamodel, xshift=0ex] {
		\tiny
		\begin{lstlisting}
Config
		\end{lstlisting}
	};


	%
	% X-ray trigger configuration
	%
	\path[informationflow] (xraytrigger)+(10ex,0ex) --
		node[pos=0] (xraytriggerconfigrom) {} (xraytrigger.0);

	\path (xraytriggerconfigrom) node[datamodel, xshift=0ex] {
		\tiny
		\begin{lstlisting}
Config
		\end{lstlisting}
	};

\end{tikzpicture}
